#ifndef CPRESCHEDULING_H
#define CPRESCHEDULING_H

#include "cjgorderprocess.h"
#include "cordermanager.h"
#include "cschprocessposition.h"

class CSchProcessPosition;

struct SSCHDATAINPUT;
struct SSCHPROCESSPOSITION;
class CSchDataUpdater;

class subFlow
{
public:
    subFlow(subFlow * vParent = nullptr);
    ~subFlow();
    subFlow * parent;//输入
    int iStartSec;//输入，父流程为子流程计算
    int iEndSec;//输入，父流程为子流程计算
    int iAvgCnt;//平均最小批量件数，输入
    QList<QSet<CJgDepandency*> *> router;//每一步所需要做的工序，输入
    //QList<processPlan > plans;//工序的计划
    subFlow * from;
    QString partName;//部件名，如果空表示是整件衣服。计算，遗传给子流程
    float totalSTD;//总的标准工时
    int iFirstBox;//第一批生产的时间（秒）,
    QList <QSet<subFlow *>> children;//子流程实际上是平等的，因为子流程有了自己的开始结束时间，计算
    bool splitByPart();//按部件产生子流程
    bool splitByMerge();//按依赖路径产生子流程
    bool split();//产生子流程，部件名为空按部件分配，部件名不空按路径分配。需要进行递归
    bool getSTD();//计算标准时间，如果有子流程按照子流程计算，如果没有子流程，按照工序表计算
    bool setTime(int iStart,int iEnd,int iCnt,float fRate);//设置流程时间，需要各级的标准时间已经计算好，然后递归设置各级子流程的时间
    bool outProcessTime(int OrderCnt,qlonglong nowSec);//递归计算使每个工序能得到一个开始时间和结束时间的数据对
    //bool getProcessTime(QString vPartName, int vSeq, int & planPerHour, int & nowPerHour);
    //void DrawSeq(QString*  sA, int maxX,int maxY,int inX, int inY, int& outX, int& outY);
    QString getString();
    QString getStringRouter();
    QString getStringChild();
    CJgDepandency * getDepandcyBySeq(int vSeq);
    float getMaxSTDbyProcess();//拿到这个流程下的按照工序计算的最大的工序的标准工时，不需要递归调用
    int getMinOperationTimeByProcess();//拿到这个流程下按照工序计算的最小做工时间，需要递归调用且在outProcessTime调用过之后
};

class CPreScheduling

{
public:
    SSCHDATAINPUT * pSchData = nullptr;//输入的数据
    SSCHPROCESSPOSITION * pPP = nullptr;//工序工位数据
    CSchDataUpdater * pUpdater = nullptr;
    CSchProcessPosition * processPos = nullptr;
    COrderManager * pOrderManager;

    CPreScheduling();
    CPreScheduling(SSCHDATAINPUT * vpSchData, SSCHPROCESSPOSITION * vpPP, CSchDataUpdater * vpUpdater,QObject *parent);
    CJgOrderProcess * GetProcessWorkingByPosition(int pos);//查找工位当前工序，有送产和待产的按照待产计算，只有在产的按照在产计算
    bool CalcuteTarget(CJgOrder * pOrder);//按订单计算小时任务数并写入工序中间数据
};

#endif // CPRESCHEDULING_H
